এক্সস্ট্রিম (XStream) লাইব্রেরি Java Object এবং XML এর মধ্যে রূপান্তরের জন্য ব্যবহৃত হয়। এটি Multiple Hierarchical Mapping বা একাধিক স্তরের (hierarchical) ডেটা মডেলকে XML এবং Java Object এর মধ্যে ম্যাপ করার জন্য খুবই কার্যকরী। XStream এর মাধ্যমে, আপনি nested objects বা complex hierarchical data structures যেমন লিস্ট, সেট, অথবা ম্যাপ এর মধ্যে সম্পর্ক স্থাপন করতে পারেন এবং সেগুলিকে XML এর মধ্যে রূপান্তর করতে পারেন।
এখানে Multiple Hierarchical Mapping এর উদাহরণ এবং XStream এর মাধ্যমে এই ধরনের ডেটা কীভাবে XML এবং Java Object এ রূপান্তর করা হয় তা দেখানো হবে।
Multiple Hierarchical Mapping in XStream
Multiple Hierarchical Mapping হল এমন একটি কাঠামো যেখানে একাধিক স্তরের অবজেক্ট (যেমন, একাধিক nested objects) XML ডেটার মধ্যে সংরক্ষিত থাকে এবং তা Java অবজেক্টে রূপান্তর করা হয়। XStream এই ধরনের ডেটা স্ট্রাকচারকে সহজে ম্যানেজ করতে পারে।
উদাহরণ: Multiple Hierarchical Mapping
ধরা যাক, আমাদের একটি Company ক্লাস রয়েছে, যার মধ্যে একাধিক Department এবং প্রতিটি Department ক্লাসের মধ্যে একাধিক Employee অবজেক্ট রয়েছে। এটি একটি nested hierarchical structure।
১. Java Classes
import java.util.List;
public class Employee {
private String name;
private String position;
public Employee(String name, String position) {
this.name = name;
this.position = position;
}
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPosition() {
return position;
}
public void setPosition(String position) {
this.position = position;
}
}
public class Department {
private String departmentName;
private List<Employee> employees;
public Department(String departmentName, List<Employee> employees) {
this.departmentName = departmentName;
this.employees = employees;
}
// Getters and Setters
public String getDepartmentName() {
return departmentName;
}
public void setDepartmentName(String departmentName) {
this.departmentName = departmentName;
}
public List<Employee> getEmployees() {
return employees;
}
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
}
public class Company {
private String companyName;
private List<Department> departments;
public Company(String companyName, List<Department> departments) {
this.companyName = companyName;
this.departments = departments;
}
// Getters and Setters
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
public List<Department> getDepartments() {
return departments;
}
public void setDepartments(List<Department> departments) {
this.departments = departments;
}
}
এখানে, Company ক্লাসের মধ্যে Department ক্লাস রয়েছে এবং Department ক্লাসে একাধিক Employee অবজেক্ট রয়েছে।
২. XML Representation
এখন, XML ডেটা কিছু এমন হতে পারে:
<company>
<companyName>TechCorp</companyName>
<departments>
<department>
<departmentName>HR</departmentName>
<employees>
<employee>
<name>Alice</name>
<position>Manager</position>
</employee>
<employee>
<name>Bob</name>
<position>HR Specialist</position>
</employee>
</employees>
</department>
<department>
<departmentName>Engineering</departmentName>
<employees>
<employee>
<name>Charlie</name>
<position>Software Engineer</position>
</employee>
<employee>
<name>David</name>
<position>DevOps Engineer</position>
</employee>
</employees>
</department>
</departments>
</company>
এটি একটি hierarchical XML structure, যেখানে company ট্যাগের মধ্যে একাধিক department রয়েছে এবং প্রতিটি department এর মধ্যে একাধিক employee অবজেক্ট রয়েছে।
৩. XStream Mapping Example for Hierarchical Structure
XStream ব্যবহার করে, আপনি এই multiple hierarchical structure এর XML এবং Java Object এর মধ্যে রূপান্তর করতে পারেন।
import com.thoughtworks.xstream.XStream;
import java.util.Arrays;
public class XStreamExample {
public static void main(String[] args) {
// Create Employees
Employee e1 = new Employee("Alice", "Manager");
Employee e2 = new Employee("Bob", "HR Specialist");
Employee e3 = new Employee("Charlie", "Software Engineer");
Employee e4 = new Employee("David", "DevOps Engineer");
// Create Departments
Department hrDepartment = new Department("HR", Arrays.asList(e1, e2));
Department engineeringDepartment = new Department("Engineering", Arrays.asList(e3, e4));
// Create Company with Departments
Company company = new Company("TechCorp", Arrays.asList(hrDepartment, engineeringDepartment));
// Create XStream instance
XStream xstream = new XStream();
// Alias mapping for XML tags
xstream.alias("company", Company.class);
xstream.alias("department", Department.class);
xstream.alias("employee", Employee.class);
xstream.alias("departments", List.class);
xstream.alias("employees", List.class);
// Convert object to XML
String xml = xstream.toXML(company);
System.out.println(xml);
// Convert XML back to object
Company companyFromXML = (Company) xstream.fromXML(xml);
System.out.println("Company: " + companyFromXML.getCompanyName());
for (Department dept : companyFromXML.getDepartments()) {
System.out.println("Department: " + dept.getDepartmentName());
for (Employee emp : dept.getEmployees()) {
System.out.println("Employee: " + emp.getName() + ", Position: " + emp.getPosition());
}
}
}
}
৪. Output (XML)
<company>
<companyName>TechCorp</companyName>
<departments>
<department>
<departmentName>HR</departmentName>
<employees>
<employee>
<name>Alice</name>
<position>Manager</position>
</employee>
<employee>
<name>Bob</name>
<position>HR Specialist</position>
</employee>
</employees>
</department>
<department>
<departmentName>Engineering</departmentName>
<employees>
<employee>
<name>Charlie</name>
<position>Software Engineer</position>
</employee>
<employee>
<name>David</name>
<position>DevOps Engineer</position>
</employee>
</employees>
</department>
</departments>
</company>
৫. Output (Java Object)
Company: TechCorp
Department: HR
Employee: Alice, Position: Manager
Employee: Bob, Position: HR Specialist
Department: Engineering
Employee: Charlie, Position: Software Engineer
Employee: David, Position: DevOps Engineer
সারাংশ
Multiple Hierarchical Mapping XStream লাইব্রেরি ব্যবহার করে Java Object এবং XML এর মধ্যে একাধিক স্তরের (nested) সম্পর্ক তৈরি করার প্রক্রিয়া সহজ করে তোলে। XStream.alias() এবং XStream.aliasField() মেথড ব্যবহার করে আপনি ক্লাসের মধ্যে স্তরের সম্পর্ক এবং XML ট্যাগের মধ্যে মাপিং করতে পারেন।
এই পদ্ধতি বিশেষভাবে দরকারী যখন আপনার ডেটা মডেল complex nested structures ধারণ করে, যেমন একাধিক অবজেক্টের মধ্যে সম্পর্ক রয়েছে। XStream আপনাকে XML এবং Java Object এর মধ্যে সহজে এবং কার্যকরভাবে এই ধরনের ডেটার রূপান্তর করার সুযোগ দেয়।
এক্সস্ট্রিম (XStream) লাইব্রেরি ব্যবহার করে আপনি Multiple Hierarchical Object Structures (অর্থাৎ, একাধিক স্তরের অবজেক্টের কাঠামো) কনফিগার করতে পারেন, যা সাধারণত জটিল এবং nested অবজেক্ট গঠন হয়। XStream-এর মাধ্যমে আপনি XML ডেটা এবং Java অবজেক্টের মধ্যে এই ধরনের hierarchical সম্পর্ক রূপান্তর করতে পারবেন। XStream আপনাকে বিভিন্ন Java ক্লাসের মধ্যে সম্পর্ক এবং heirarchical structure পরিচালনা করতে সহায়তা করে, বিশেষত যখন আপনার অবজেক্ট গ্রাফ বা ডেটা কাঠামো খুব জটিল হয়।
Multiple Hierarchical Object Structures কনফিগারেশন
XStream এ multiple hierarchical structures কনফিগার করার জন্য, আপনি alias, implicit collections, এবং converter কনফিগারেশন ব্যবহার করতে পারেন। এটি আপনাকে একাধিক ক্লাসের মধ্যে সম্পর্ক তৈরি করতে এবং XML ফরম্যাটে একাধিক স্তরের অবজেক্ট কাঠামো সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করতে সাহায্য করবে।
Step-by-Step Guide: Multiple Hierarchical Object Structures জন্য XStream কনফিগার করা
1. একাধিক স্তরের অবজেক্ট কাঠামো তৈরি করা
ধরা যাক, আমাদের একটি Library ক্লাস রয়েছে, যার মধ্যে অনেক Book অবজেক্ট সংরক্ষিত থাকবে। এই কাঠামোটি একটি Multiple Hierarchical Object Structure তৈরি করবে, যেখানে Library ক্লাসের মধ্যে Book অবজেক্টের একটি লিস্ট থাকবে।
Java ক্লাস তৈরি করা
import com.thoughtworks.xstream.annotations.XStreamAlias;
import java.util.List;
public class Library {
private String name;
private List<Book> books;
// Constructor, Getters and Setters
public Library(String name, List<Book> books) {
this.name = name;
this.books = books;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Book> getBooks() {
return books;
}
public void setBooks(List<Book> books) {
this.books = books;
}
}
@XStreamAlias("book")
class Book {
private String title;
private String author;
// Constructor, Getters and Setters
public Book(String title, String author) {
this.title = title;
this.author = author;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
এখানে, Library ক্লাসে Book অবজেক্টের একটি List রাখা হয়েছে। এবং @XStreamAlias অ্যানোটেশন ব্যবহার করা হয়েছে, যা Book ক্লাসের জন্য XML ট্যাগের নাম কাস্টমাইজ করে।
2. XStream কনফিগারেশন করা
এখন আমরা Library এবং Book ক্লাসের মধ্যে সম্পর্ক নির্ধারণ করবো এবং XML ফরম্যাটে এই অবজেক্ট কাঠামো সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করবো।
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import java.util.ArrayList;
import java.util.List;
public class XStreamMultipleHierarchyExample {
public static void main(String[] args) {
// Create Book objects
Book book1 = new Book("Java Programming", "John Doe");
Book book2 = new Book("Effective Java", "Joshua Bloch");
// Add Books to Library
List<Book> books = new ArrayList<>();
books.add(book1);
books.add(book2);
// Create Library object
Library library = new Library("City Library", books);
// Create an instance of XStream
XStream xstream = new XStream(new DomDriver());
// Register alias for classes
xstream.alias("library", Library.class);
xstream.alias("book", Book.class);
xstream.addImplicitCollection(Library.class, "books");
// Serialize the Library object to XML
String xml = xstream.toXML(library);
System.out.println("Serialized XML:\n" + xml);
// Deserialize XML back into a Library object
Library deserializedLibrary = (Library) xstream.fromXML(xml);
System.out.println("\nDeserialized Library:");
System.out.println("Library Name: " + deserializedLibrary.getName());
for (Book book : deserializedLibrary.getBooks()) {
System.out.println("Book Title: " + book.getTitle() + ", Author: " + book.getAuthor());
}
}
}
3. Output
উপরের কোডটি চালানোর পর, XML সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন করা হবে, যা Multiple Hierarchical Object Structures প্রদর্শন করবে।
Serialized XML:
<?xml version="1.0" encoding="UTF-8"?>
<library>
<name>City Library</name>
<books>
<book>
<title>Java Programming</title>
<author>John Doe</author>
</book>
<book>
<title>Effective Java</title>
<author>Joshua Bloch</author>
</book>
</books>
</library>
Deserialized Object:
Library Name: City Library
Book Title: Java Programming, Author: John Doe
Book Title: Effective Java, Author: Joshua Bloch
4. XStream Configuration Explanation
- Alias Registration:
xstream.alias("library", Library.class)এবংxstream.alias("book", Book.class)এর মাধ্যমেLibraryএবংBookক্লাসের জন্য কাস্টম XML ট্যাগ নাম নির্ধারণ করা হয়েছে। এখানেlibraryএবংbookট্যাগ নাম ব্যবহার করা হয়েছে। - Implicit Collection:
xstream.addImplicitCollection(Library.class, "books")এই কনফিগারেশনটি XStream কে বলে দেয় যে,Libraryক্লাসেরbooksফিল্ডটি একটি implicit collection (যেটিList<Book>)। এটি XML ফাইলের মধ্যেbooksট্যাগ হিসেবে থাকবে। - Hierarchical Structure:
XStream XML ট্যাগের হায়ারার্কিক্যাল স্ট্রাকচার সঠিকভাবে সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করতে পারে। এখানেLibraryক্লাসের মধ্যেList<Book>রয়েছে, যেটি XML ডেটাতে<books>ট্যাগের মধ্যে থাকবে এবং প্রতিটিBookঅবজেক্ট<book>ট্যাগে থাকবে।
5. Performance Considerations
যখন আপনি Multiple Hierarchical Object Structures ব্যবহারের মাধ্যমে XStream কনফিগার করছেন, তখন কিছু পারফরম্যান্স অপটিমাইজেশন কৌশল বিবেচনা করা যেতে পারে:
- Alias ব্যবহারে Reflection কমানো:
aliasকনফিগারেশন ব্যবহার করে Reflection কমিয়ে, সিরিয়ালাইজেশন ও ডেসিরিয়ালাইজেশন প্রক্রিয়াকে দ্রুত করা যায়। - Implicit Collection: Java ক্লাসের মধ্যে nested বা collection অবজেক্ট থাকলে,
addImplicitCollectionব্যবহার করে XML ডেটা কাঠামো সহজ ও পরিষ্কার রাখতে পারেন।
সারাংশ
XStream এর মাধ্যমে Multiple Hierarchical Object Structures সহজেই কনফিগার করা যায়। Alias এবং Implicit Collection ব্যবহার করে আপনি Java অবজেক্টের মধ্যে সম্পর্ক এবং হায়ারার্কি XML ফরম্যাটে সঠিকভাবে সিরিয়ালাইজ করতে পারেন। XStream এর কনফিগারেশনগুলি পারফরম্যান্স এবং XML ফরম্যাটের কাস্টমাইজেশনে সহায়তা করে, যখন আপনি জটিল অবজেক্ট কাঠামো পরিচালনা করেন।
XStream একটি জাভা লাইব্রেরি যা সহজভাবে জাভা অবজেক্ট এবং XML বা JSON ডেটার মধ্যে কনভার্সন (সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন) করতে সহায়তা করে। অনেক সময় আপনার ডেটা স্ট্রাকচার জটিল (complex) হতে পারে, যেখানে নেস্টেড অবজেক্ট এবং অ্যারে/লিস্ট থাকে, এবং তখন Complex Nested XML/JSON Data Mapping করা প্রয়োজন। XStream এর মাধ্যমে, আপনি সহজে জটিল নেস্টেড XML বা JSON ডেটা মডেলকে Java অবজেক্টে রূপান্তর এবং Java অবজেক্ট থেকে XML/JSON এ রূপান্তর করতে পারেন।
এই টিউটোরিয়ালে, আমরা Complex Nested XML/JSON Data Mapping এর উদাহরণ সহ এক্সস্ট্রিমের মাধ্যমে কিভাবে জটিল ডেটা ম্যাপিং করা যায়, তা দেখব।
১. Complex Nested XML/JSON Data Mapping কী?
Complex Nested Data Mapping হল এমন একটি প্রক্রিয়া যেখানে XML বা JSON ডকুমেন্টের মধ্যে একাধিক স্তরের (nested) অবজেক্ট, অ্যারে বা লিস্ট থাকে এবং সেগুলিকে Java অবজেক্টে রূপান্তর করা হয় (বা Java অবজেক্ট থেকে XML/JSON এ রূপান্তর করা হয়)। এই ধরনের ডেটা স্ট্রাকচার সাধারণত একাধিক সম্পর্কিত অবজেক্ট, অ্যারে, এবং কাস্টম টাইপগুলোকে অন্তর্ভুক্ত করে থাকে।
এখানে Complex Nested XML/JSON Data Mapping এর উদাহরণ হবে:
- XML ফরম্যাটে একটি
Personঅবজেক্ট, যার মধ্যেAddressনামক একটি নেস্টেড অবজেক্ট এবংPhoneNumbersনামক একটি লিস্ট রয়েছে। - JSON ফরম্যাটে একই ধরনের স্ট্রাকচার থাকবে।
২. Complex Nested XML Mapping with XStream
XML Example:
ধরা যাক, আমাদের একটি Person অবজেক্ট রয়েছে, যার মধ্যে name, age, একটি নেস্টেড Address অবজেক্ট এবং একটি ফোন নম্বরের লিস্ট রয়েছে।
XML Structure:
<person>
<name>John Doe</name>
<age>30</age>
<address>
<street>123 Main St</street>
<city>Springfield</city>
</address>
<phoneNumbers>
<phoneNumber>123-456-7890</phoneNumber>
<phoneNumber>987-654-3210</phoneNumber>
</phoneNumbers>
</person>
Java Classes:
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
class Address {
private String street;
private String city;
public Address(String street, String city) {
this.street = street;
this.city = city;
}
// Getters and setters
}
class Person {
private String name;
private int age;
private Address address;
@XStreamImplicit
private List<String> phoneNumbers;
public Person(String name, int age, Address address, List<String> phoneNumbers) {
this.name = name;
this.age = age;
this.address = address;
this.phoneNumbers = phoneNumbers;
}
// Getters and setters
}
public class XStreamNestedExample {
public static void main(String[] args) {
// Create Address object
Address address = new Address("123 Main St", "Springfield");
// Create a list of phone numbers
List<String> phoneNumbers = Arrays.asList("123-456-7890", "987-654-3210");
// Create Person object
Person person = new Person("John Doe", 30, address, phoneNumbers);
// Create XStream object
XStream xStream = new XStream();
// Alias for classes
xStream.alias("person", Person.class);
xStream.alias("address", Address.class);
// Convert Java object to XML
String xml = xStream.toXML(person);
System.out.println(xml);
}
}
XML Output:
<person>
<name>John Doe</name>
<age>30</age>
<address>
<street>123 Main St</street>
<city>Springfield</city>
</address>
<phoneNumbers>
<phoneNumber>123-456-7890</phoneNumber>
<phoneNumber>987-654-3210</phoneNumber>
</phoneNumbers>
</person>
এখানে, @XStreamImplicit ব্যবহার করে phoneNumbers লিস্টটিকে XML এ <phoneNumber> ট্যাগে রূপান্তরিত করা হয়েছে, এবং address অবজেক্টটি <address> ট্যাগে রূপান্তরিত হয়েছে।
৩. Complex Nested JSON Mapping with XStream
XStream শুধু XML নয়, JSON কনভার্সনও সমর্থন করে। JSON ডেটা মডেলিংয়ের ক্ষেত্রে, আপনি XStream ব্যবহার করে জাভা অবজেক্টকে JSON ফরম্যাটে রূপান্তর করতে পারেন এবং এর উল্টোও করতে পারেন।
JSON Example:
ধরা যাক, আমাদের একটি Person অবজেক্ট রয়েছে, যার মধ্যে name, age, একটি নেস্টেড Address অবজেক্ট এবং একটি ফোন নম্বরের লিস্ট রয়েছে।
JSON Structure:
{
"person": {
"name": "John Doe",
"age": 30,
"address": {
"street": "123 Main St",
"city": "Springfield"
},
"phoneNumbers": [
"123-456-7890",
"987-654-3210"
]
}
}
Java Classes (Same as XML Example):
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.json.JsonWriter;
import com.thoughtworks.xstream.io.xml.StaxDriver;
import java.util.List;
import java.util.Arrays;
class Address {
private String street;
private String city;
public Address(String street, String city) {
this.street = street;
this.city = city;
}
// Getters and setters
}
class Person {
private String name;
private int age;
private Address address;
private List<String> phoneNumbers;
public Person(String name, int age, Address address, List<String> phoneNumbers) {
this.name = name;
this.age = age;
this.address = address;
this.phoneNumbers = phoneNumbers;
}
// Getters and setters
}
public class XStreamJSONExample {
public static void main(String[] args) {
// Create Address object
Address address = new Address("123 Main St", "Springfield");
// Create a list of phone numbers
List<String> phoneNumbers = Arrays.asList("123-456-7890", "987-654-3210");
// Create Person object
Person person = new Person("John Doe", 30, address, phoneNumbers);
// Create XStream object
XStream xStream = new XStream(new StaxDriver());
// Registering alias for the class
xStream.alias("person", Person.class);
xStream.alias("address", Address.class);
// Set XStream to output JSON
xStream.setMode(XStream.NO_REFERENCES);
xStream.processAnnotations(Person.class);
// Convert Java object to JSON
String json = xStream.toXML(person);
System.out.println(json);
}
}
JSON Output:
{
"person": {
"name": "John Doe",
"age": 30,
"address": {
"street": "123 Main St",
"city": "Springfield"
},
"phoneNumbers": [
"123-456-7890",
"987-654-3210"
]
}
}
এখানে, JSON ডেটা একইরকমভাবে XStream ব্যবহার করে Java অবজেক্টে রূপান্তরিত হয়েছে এবং কাস্টম alias ব্যবহৃত হয়েছে।
৪. Complex Nested Mapping এর সুবিধা এবং প্রয়োগ
সুবিধা:
- সহজ কনভার্সন: XML বা JSON থেকে Java অবজেক্টে বা Java থেকে XML/JSON এ ডেটা কনভার্ট করা সহজ এবং কার্যকর।
- নেস্টেড ডেটা মডেলিং: একাধিক সম্পর্কিত অবজেক্ট, অ্যারে, এবং লিস্টগুলো সহজে XML বা JSON এ রূপান্তর করা যায়।
- কাস্টম আলিয়াস এবং ফিল্ড ম্যাপিং: XML বা JSON এর ট্যাগ নাম বা অ্যাট্রিবিউট নাম কাস্টমাইজ করা সম্ভব।
প্রয়োগ:
- RESTful APIs: JSON ডেটার মাধ্যমে সার্ভার-টু-ক্লায়েন্ট বা ক্লায়েন্ট-টু-সার্ভার ডেটা ট্রান্সফার।
- Configuration Files: অ্যাপ্লিকেশন কনফিগারেশন বা ডেটা মডেল XML/JSON ফরম্যাটে সংরক্ষণ।
- Data Serialization: ডেটা সঞ্চয় বা সিস্টেমের মধ্যে ডেটা এক্সচেঞ্জের জন্য XML বা JSON ডেটা ফরম্যাটে সংরক্ষণ।
সারাংশ
XStream এর মাধ্যমে Complex Nested XML/JSON Data Mapping খুবই সহজ এবং কার্যকরী। আপনি সহজেই নেস্টেড অবজেক্ট, লিস্ট এবং অ্যারে কাস্টম কনফিগারেশন এবং আলিয়াস ব্যবহার করে XML বা JSON ফরম্যাটে রূপান্তর করতে পারেন। এই কনভার্সন প্রক্রিয়া ডেটা সংরক্ষণ, এক্সচেঞ্জ এবং প্রক্রিয়া করার জন্য একটি খুবই শক্তিশালী উপায়। XStream এর কাস্টম অ্যালিয়াস এবং ফিল্ড ম্যাপিং দ্বারা আপনি আপনার XML/JSON ফরম্যাটের কাস্টমাইজেশন সহজে করতে পারেন।
XStream লাইব্রেরি একটি খুবই শক্তিশালী টুল যা XML এবং Java অবজেক্টের মধ্যে রূপান্তর করার জন্য ব্যবহৃত হয়। Hierarchical Mapping এর মাধ্যমে আপনি নেস্টেড অবজেক্টগুলির মধ্যে সম্পর্ক স্থাপন করতে পারেন, যেখানে একটি অবজেক্টের ভিতরে অন্য অবজেক্ট (এবং তারও ভিতরে আরো অবজেক্ট) থাকতে পারে। XStream-এর মাধ্যমে আপনি সহজেই এই হায়ারার্কি (hierarchy) তৈরি করতে এবং তা XML ফরম্যাটে রূপান্তর করতে পারেন।
এখানে XStream এর মাধ্যমে Hierarchical Mapping কিভাবে কাজ করে, তার একটি উদাহরণ দেখানো হলো।
Hierarchical Mapping with XStream
ধরা যাক, আমাদের একটি Person ক্লাস রয়েছে, এবং প্রতিটি Person অবজেক্টের মধ্যে একটি Address অবজেক্টও রয়েছে। আমরা এই সম্পর্কটি XML ফরম্যাটে কিভাবে রূপান্তর করবো তা দেখব।
Step 1: Person এবং Address ক্লাস তৈরি করা
এখানে, Person ক্লাসের মধ্যে Address নামে একটি নেস্টেড অবজেক্ট থাকবে।
public class Address {
private String street;
private String city;
// Constructor
public Address(String street, String city) {
this.street = street;
this.city = city;
}
// Getters and Setters
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
এটি Address ক্লাস, যেখানে street এবং city দুটি ফিল্ড রয়েছে।
public class Person {
private String name;
private int age;
private Address address;
// Constructor
public Person(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
এটি Person ক্লাস, যেখানে name, age এবং address (এটি একটি Address অবজেক্ট) রয়েছে।
Step 2: XStream ব্যবহার করে XML সিরিয়ালাইজেশন
এখন, XStream ব্যবহার করে Person অবজেক্টকে XML এ রূপান্তর করা হবে।
import com.thoughtworks.xstream.XStream;
public class Main {
public static void main(String[] args) {
// Create an Address object
Address address = new Address("123 Main St", "New York");
// Create a Person object with the Address
Person person = new Person("John Doe", 30, address);
// Create an instance of XStream
XStream xstream = new XStream();
// Set up XStream to use the Person and Address classes
xstream.alias("person", Person.class);
xstream.alias("address", Address.class);
// Convert the Person object to XML
String xml = xstream.toXML(person);
// Print the XML output
System.out.println("Serialized XML: ");
System.out.println(xml);
}
}
এখানে, XStream ব্যবহার করে Person এবং Address ক্লাসকে XML এ রূপান্তর করা হচ্ছে। alias মেথডের মাধ্যমে person এবং address এর জন্য XML ট্যাগ নাম কাস্টমাইজ করা হয়েছে।
Step 3: XML Output
যখন আপনি উপরের কোডটি রান করবেন, তখন XML আউটপুট এমন হবে:
<person>
<name>John Doe</name>
<age>30</age>
<address>
<street>123 Main St</street>
<city>New York</city>
</address>
</person>
এখানে, Person অবজেক্টের মধ্যে থাকা Address অবজেক্টটি XML এর <address> ট্যাগের মধ্যে কনভার্ট হয়েছে এবং তার মধ্যে থাকা street ও city ফিল্ডগুলি যথাক্রমে <street> এবং <city> ট্যাগের মধ্যে রূপান্তরিত হয়েছে।
Step 4: Deserialization - XML থেকে Java Object
এখন, XML থেকে পুনরায় Person অবজেক্ট তৈরি করার জন্য Deserialization করা হবে।
public class Main {
public static void main(String[] args) {
// XML string
String xml = "<person><name>John Doe</name><age>30</age><address><street>123 Main St</street><city>New York</city></address></person>";
// Create an instance of XStream
XStream xstream = new XStream();
// Set up XStream to use the Person and Address classes
xstream.alias("person", Person.class);
xstream.alias("address", Address.class);
// Convert the XML back to a Java object
Person person = (Person) xstream.fromXML(xml);
// Print the Java object data
System.out.println("Deserialized Java Object: ");
System.out.println("Name: " + person.getName());
System.out.println("Age: " + person.getAge());
System.out.println("Address: " + person.getAddress().getStreet() + ", " + person.getAddress().getCity());
}
}
এখানে, XML থেকে Person অবজেক্ট পুনরায় তৈরি করা হচ্ছে এবং সেই অবজেক্টের ফিল্ডগুলো প্রিন্ট করা হচ্ছে।
Step 5: Deserialization Output
Deserialized Java Object:
Name: John Doe
Age: 30
Address: 123 Main St, New York
এখানে, XML ডেটা থেকে Person অবজেক্ট এবং তার ভিতরে থাকা Address অবজেক্টটি সঠিকভাবে পুনরায় তৈরি হয়েছে।
সারাংশ
XStream ব্যবহার করে Hierarchical Mapping খুবই সহজ এবং সোজা। XStream XML এবং জাভা অবজেক্টের মধ্যে নেস্টেড সম্পর্ক (nested relationships) সঠিকভাবে রূপান্তর করতে সক্ষম।
- Alias ব্যবহার করে XML ট্যাগের নাম কাস্টমাইজ করা যায়।
- Hierarchical Mapping এ একটি অবজেক্টের ভিতরে অন্য একটি অবজেক্ট (নেস্টেড অবজেক্ট) থাকতে পারে এবং XStream স্বয়ংক্রিয়ভাবে সেগুলিকে XML আউটপুটে রূপান্তর করতে পারে।
এভাবে, XStream এর মাধ্যমে নেস্টেড অবজেক্টের রূপান্তর ও কাস্টমাইজেশন অত্যন্ত সহজ এবং কার্যকরী।
Read more